package com.stone.design.mode.pipeline.netty.context;

import com.stone.design.mode.pipeline.netty.handler.ChannelHandler;
import com.stone.design.mode.pipeline.netty.pipeline.ChannelInboundInvoker;
import com.stone.design.mode.pipeline.netty.pipeline.ChannelOutboundInvoker;
import com.stone.design.mode.pipeline.netty.pipeline.ChannelPipeline;

import java.util.concurrent.Executor;

/**
 * handler上下文接口
 * 继承了 ChannelInboundInvoker 接口，表示它具有传播入站事件的能力
 * 继承了 ChannelOutboundInvoker 接口，表示它具有传播出站事件的能力
 *
 * @author wenpan 2024/01/21 17:08
 */
public interface ChannelHandlerContext extends ChannelInboundInvoker, ChannelOutboundInvoker {

    /**
     * 该context里的回调方法应该在哪个线程池里执行
     */
    Executor executor();

    /**
     * handler 的名称
     */
    String name();

    /**
     * 该context所持有的handler
     */
    ChannelHandler handler();

    /**
     * 该context所属的pipeline
     */
    ChannelPipeline pipeline();

    //
    // context需要具有处理入站和出站的能力，所以继承了 ChannelInboundInvoker, ChannelOutboundInvoker 这两个接口
    // -----------------------------------------------------------------------------------------------------

    /**
     * context具有发布事件的能力，传播事件
     */
    @Override
    ChannelHandlerContext fireChannelRegistered();

    /**
     * context具有发布事件的能力，传播事件
     */
    @Override
    ChannelHandlerContext fireChannelActive();

    /**
     * context具有flush的能力，传播事件
     */
    @Override
    ChannelHandlerContext flush();
}
